///////////////////////////////////////////////////////////////////////////////

#ifndef _SERVERBATTLEFIELD_H_
#define _SERVERBATTLEFIELD_H_

////////////////////////////////////////////////////////////////////////////////

#ifndef _BATTLEFIELD_H_
#include "battlefield.h"
#endif

////////////////////////////////////////////////////////////////////////////////

#ifndef _SERVERSTATE_H_
#include "serverstate.h"
#endif

////////////////////////////////////////////////////////////////////////////////

class Physics;

////////////////////////////////////////////////////////////////////////////////


/** Battlefield representation on server side.
*   Manages all objects on the game.
*
*  @author   Anastasia Karpinska
*  @since    Nov 07th, 2009
*  @updated  Nov 12th, 2009
*/
class ServerBattlefield : public Battlefield
{
////////////////////////////////////////////////////////////////////////////////

public:

////////////////////////////////////////////////////////////////////////////////


    /** Constructor */
    ServerBattlefield();


    /** Destructor */
    ~ServerBattlefield();


////////////////////////////////////////////////////////////////////////////////


    /** Get server state */
    ServerState GetState() const;


////////////////////////////////////////////////////////////////////////////////


    /** Update battlefield state */
    void Update( size_t _dt );


    /** Find player by ID */
    Player* FindPlayer( int _ID );


    /** Add player */
    void AddPlayer( int _ID );


    /** Remove player */
    void RemovePlayer( int _ID );


    /** Set client input */
    void SetClientInput( int _clientID, const ClientInput& _input, size_t _creationTime );


////////////////////////////////////////////////////////////////////////////////

private:

////////////////////////////////////////////////////////////////////////////////


    /** Physics engine */
    Physics* m_PhysicsEngine;


////////////////////////////////////////////////////////////////////////////////


    /** Deletes unused bullets */
    void DestroyBullets();


    /** Process player's shooting */
    void ProcessUserInput( size_t _dt );


////////////////////////////////////////////////////////////////////////////////

};

////////////////////////////////////////////////////////////////////////////////

#endif
